#ifndef PRODUCT_CONFIG_H
#define PRODUCT_CONFIG_H

    #include <stdio.h>
    #include "freertos/FreeRTOS.h"
    #include "freertos/task.h"

    #define ARCH_OS_NATIVE_PRIORITY_DEFAULT (configMAX_PRIORITIES -1)
    
    //用户处理时候的OTA任务,优先级最高
	#define TASK_PROP_OTA  	  (ARCH_OS_NATIVE_PRIORITY_DEFAULT)

    //处理串口数据优先级次高
	#define TASK_PROP_UART  	  (ARCH_OS_NATIVE_PRIORITY_DEFAULT-1)

    //网络相关任务优先级最高
    #define TASK_PROP_NET (ARCH_OS_NATIVE_PRIORITY_DEFAULT-1)

    //UI显示任务优先级第3高
    #define TASK_PROP_DISPLAY (ARCH_OS_NATIVE_PRIORITY_DEFAULT-2)

    //处理缓存区数据优先级第3高
    #define TASK_PROP_CACHE (ARCH_OS_NATIVE_PRIORITY_DEFAULT-2)

    //底层驱动及信号检测的优先级第4
    #define TASK_PROP_DRIVER (ARCH_OS_NATIVE_PRIORITY_DEFAULT-3)

    //app逻辑处理任务的优先级排第4
    #define TASK_PROP_APP (ARCH_OS_NATIVE_PRIORITY_DEFAULT-3)

    //同IOT平台的交互,任务优先级排第5
    #define TASK_PROP_IOTTALK (ARCH_OS_NATIVE_PRIORITY_DEFAULT-4)

    #define EXAMPLE_CHASE_SPEED_MS      10
    #define WIFI_LOOP_SPEED_MS      50

    #define BUF_CACHE_SIZE    1024
    #define PACKET_HEADER 0xa5

    #define CUSTOM_LOCA 0x2000
    #define CUSTOM_ADD 0x1000

    #define REGISTER 0X00000000 //注册包
    #define INQUIRE 0X00000001 //查询指令
    #define ACK 0X00000002 //回报帧
    #define CUSTOM_PART_DATA 0xAA010001 //自定分段信息
    #define CUSTOM_WAIT 0xAA030000 //自定义延时时间
    #define CUSTOM_SAVE 0xAA040000 //自定以保存模式
    #define MAIN_MODE 0xAAAA0000 //主模式
    #define CUSTOM_SSP 0xAAAA0002 //自定义工作模式
    #define EFFECT_SSP 0xAAAA0003 //自定义灯光效果模式
    #define SCENE_MODE 0XAAAA0006 //场景模式 
    #define OPEN_CLOSE 0xAAAA0007 //开关机
    #define RGB_BRIGHNESS 0xAABB0001
    #define HIGH_SPEED 0XAADD0000 //高速模式包
    #define NET_RESET 0xBBAA0000
    #define OTA 0xFF000000
    #define HEARTBEAT_PACKET 0xFFFFFFFF
    

    //定义方便识别的 类型    
    typedef uint8_t     u8;
    typedef int8_t      s8;
    typedef uint8_t     vu8;
    typedef char        uc8;

    typedef uint16_t    u16;
    typedef int16_t     s16;
    typedef uint16_t    vu16;
    typedef int16_t     vs16;
    typedef uint16_t    uc16;

    typedef uint32_t    u32;
    typedef uint64_t u64;
    typedef uint32_t    uc32;
    typedef uint32_t    vu32;




    typedef enum
    {
        NONE_SOURCE=0, //没有源
        UART_SOURCE, //串口源
        TCP_SOURCE, //网络源
        NUM_SOURCE, 
    }DATA_SOURCE; //数据源

    typedef struct 
    {
        DATA_SOURCE source; //数据来源
        u16 len; //待发送数据长度
        u8 *data; //待发送数据内容
    }cache_param; //spi口发送数据参数

    typedef struct 
    {
        u16 length;
        u8 *data;
    }PACKET; //解析包的数据

    typedef struct 
    {
        u8 *send_data; //待发送数据内容
        u16 send_len; //待发送数据长度
    }spi_send_param; //spi口发送数据参数

    typedef enum
    {
        OPT_NONE,//0
        OPT_POWER_TURNON, //1 开机操作
        OPT_POWER_TURNOFF, //2 关机操作
        OPT_GO_NEXT, //3 下一步
        OPT_GO_ADD, //4 增加
        OPT_GO_ADD_CONTINUE, //5 持续增加
        OPT_GO_REDUCE,//6 减小
        OPT_GO_REDUCE_CONTINUE, //7 持续减小
        OPT_GO_MIC,//8 进入麦克风
        OPT_OUT_MIC, //9 退出麦克风
        OPT_INVALID,//10 无效操作
        OPT_MATCH_NET, //11 开始配网
        NUM_APP_OPT,//12 操作枚举值
    }EM_APP_OPT;

    typedef struct 
    {
        EM_APP_OPT oepation;
    }SYS_OPT_KEY;

    typedef struct
    {
        void (*handle)(SYS_OPT_KEY opt);
    }light_MODE; //指针函数，用于控制灯带模式切换 

    typedef enum
    {
        SSP_POWER_OFF,//0 对应灯带不亮状态
        SSP_LOGO,//1 对应开机状态
        SSP_MODE_1,//2模式1 彩虹
        SSP_MODE_SCENE,//3场景模式
        SSP_MODE_PART, //4 调色盘
        SSP_MODE_CUSTOM, //5自定义模式
        NUM_SYS_SSP,//6 状态枚举值
    }EM_SYS_SSP; //系统状态信息

    typedef enum
    {
        SCENE_ZERO, //0号
        READ_MODE, //1阅读模式
        WORK_MODE, //2工作模式
        SLEEP_MODE, //3睡眠模式
        AUROAR_MODE, //4极光模式
        CANDLELIGHT_MODE,//5烛光模式
        BIRTHDAY_MODE,//6生日模式
        METEROR_MODE,//7流星
        REST_MODE,//8睡觉
        MEDITATION_MODE,//9冥想
        FLAME_MODE,//10火焰
        BUSINESS_MODE,//11商务
        ALARM_MODE,//12警报
        TIDE_MODE,//13潮汐
        ELETROUIC_MUSIC_MODE,//14电子音乐
        UNIVERSE_MODE,//15宇宙
        SCENE_MODE_NUM,
    }EM_SCENE_SSP;


    typedef struct 
    {
        void (*handle)(uint8_t num,uint8_t wait,uint8_t len,uint8_t *buff);
    }LIGHT_EFFECT;

    typedef struct 
    {
        EM_SYS_SSP save_ssp; //保存当前状态
        u8 brighness_level; //灯光亮度
        EM_SCENE_SSP scene_mode; //场景模式
        u8 RGB[3];
        u8 custom_ssp;
    }app_status_info_t;

    typedef enum
    {
        WIFI_POWER_OFF,     //0WIFI蓝牙关闭状态，对应节能模式
        BULFI_OPEN,     //1 bulfi开启状态，正在配网中
        BULFI_CONNECT_OUT,  //2 blufi连接超时
        WIFI_CONNECTING,    //3 WIFI连接中
        WIFI_CONNECTED,     //4 WIFI连接完成
        NUM_WIFI_SSP,       //5 WIFI状态枚举值
    }EM_WIFI_SSP; //wifi状态信息

    typedef struct 
    {
        u8 lastssp;
        u8 ssp;
        u8 recssp;
    }CUSTOM_SYS;

    typedef struct 
    {
        u8 light_effect_ssp;
        u8 wait;
        u8 len;
        u8 buf[45];
    }LIGHT_EFFECT_T;

    typedef enum
    {
        EFFECT_ZERO=0,//灯效0 
        EFFECT_FADE, //淡入淡出
        EFFECT_FADE_OUT, //淡出
        EFFECT_FADE_IN, //淡入
        EFFECT_MARQUEE_COUNTER_CLOCKWISE, //跑马逆时针
        EFFECT_MARQUEE_CLOCKWISE, //跑马顺时针
        EFFECT_FLICKER_ALL, //全频闪烁
        EFFECT_FLICKER_SUBSECTION, //分频闪烁
        EFFECT_WATERFALL, //流水向前
        EFFECT_WATERALL_COUNTER, //流水向后
        RAINBOW_REVERSE, //彩虹反向
        RAINBOW_FORWARD, //彩虹灯正向
        EFFECT_ENUM,
    }LIGHT_EFFECT_MODE;

    typedef struct 
    {
        EM_SCENE_SSP ssp;
        EM_SCENE_SSP last_ssp;
    }SCENE_SYS;

    typedef struct 
    {
    void (*handle)(void);
    }SCENE_HANDLE; //场景模式子处理函数

    typedef struct 
    {
        EM_WIFI_SSP wifi_ssp;
        EM_WIFI_SSP last_wifi_ssp;
    }WIFI_SYS;

    typedef struct 
    {
        EM_SYS_SSP lastssp;
        EM_SYS_SSP ssp;
        EM_SYS_SSP recssp;
    }ST_SYS;

    typedef struct
    {
        //EM_SYS_SSP ssp_config; //模式
        u8 R;//红光
        u8 G;//lv光
        u8 B;//蓝光
        u8 W;//UV
        u8 W_brighness; //UV灯亮度
    }MODE_CONFIG;

    typedef struct 
    {
        u8 len;
        u8 RGB[45];
    }PART_INFO_T;

    typedef struct 
    {
    void (*handle)(void);
    }WIFI_MODE; //指针函数，用于控制灯带模式切换 

#endif